package com.hqyj.webSocket;

import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * @program:vueSystem
 * @description:
 * @author:黄明亮
 * @create:2022-10-12 15:03
 **/
@Component
@ServerEndpoint(value = "/kickWs")
public class KickWebSocket {

    //纪录所有会话
    public static List<Session> list=new LinkedList<>();
    //纪录会话id和用户名
    public static List<HashMap<String,Object>> listMap=new LinkedList<>();
    //常见一个客户端的触发事件
    //session会话，一个客户端对应一个session
    @OnOpen
    public void open(Session s){
        System.out.println(s.getId()+"已经上线了");
        list.add(s);
    }

    @OnClose
    public void close(Session s){
        System.out.println(s.getId()+"已经下线了");
        //删除会话
        list.remove(s);
        //删除map纪录过的用户
        for(Map<String,Object> m :listMap){
            if(m.get("id").equals(s.getId())){
                listMap.remove(m);
            }
        }
    }

    //接受客户端发送的消息
    @OnMessage
    public void message(Session s,String str) throws IOException {
        System.out.println("客户端发送的消息"+s.getId()+":发送的消息是"+str);

        //查找用户是否已经登录过
        if(listMap.size()>0){
            for(Map<String,Object> m :listMap){
                //查找已经登录过的用户名
                if(m.get("name").equals(str)){
                    //查找这个用户对应的session会话
                    for(Session ss:list){
                        //看他是否在线。踢他下线
                        if(ss.getId().equals(m.get("id"))){
                            if(ss.isOpen()){
                                ss.getBasicRemote().sendText("已登录");
                            }
                        }
                    }
                }
            }
        }
        /*------添加登录用户的信息--------*/
        HashMap<String,Object> map = new HashMap<>();
        //纪录id
        map.put("id",s.getId());
        //纪录用户名
        map.put("name",str);
        listMap.add(map);
    }

    @OnError
    public void error(Session s,Throwable t){
        System.out.println("客户端"+s.getId()+"出现异常"+t.getMessage());
    }
}
